package microformatParser;

/**
 *
 * @author folone.org.ua
 */
import java.util.*;
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.w3c.dom.html.*;
import org.xml.sax.*;

public class document {

    private HTMLDocument _document; //Документ, который парсим
    private Vector<String> _knownMicroformats; //Список известных микроформатов
    
    public document(HTMLDocument doc, Vector<String> knownMicroformats) {
        _document = doc;
        _knownMicroformats = knownMicroformats;
    }
    
    /**
     * проверяем на наличие микроформата по его имени
     * @author folone.org.ua
     */
    private Vector<microformat> parseDocument (String microformatName) throws Exception {
        
        if(_document.getFirstChild() == null)
            throw new Exception("Invalid document"); //Плохой код
        
        Vector<microformat> microformatsPresent = new Vector();
        NodeList list = _document.getElementsByTagName("*");
        
        for (int i=0; i<list.getLength(); i++) {
            if(list.item(i).hasAttributes()) {
                NamedNodeMap map = list.item(i).getAttributes();
                for (int j=0; j<map.getLength(); j++) {
                    if (map.item(j).getNodeValue().equals(microformatName)){
                        microformat found = new microformat();
                        NodeList mkfChilds = map.item(j).getChildNodes();
                        for (int k=0; k<mkfChilds.getLength(); k++){
                            if (mkfChilds.item(k).getNodeName().equals("class"))
                                found.addClass(mkfChilds.item(k).getNodeValue());
                            if (mkfChilds.item(k).getNodeName().equals("rel"))
                                found.addRel(mkfChilds.item(k).getNodeValue());
                            if (mkfChilds.item(k).getNodeName().equals("rev"))
                                found.addRev(mkfChilds.item(k).getNodeValue());
                        }
                        microformatsPresent.add(found);
                    }
                }
            }
        }
        
        return microformatsPresent;
    }
    
    /**
     * Строим список списков по всем известным микроформатам
     * @author folone.org.ua
     */
    public Vector<Vector> getMicroformats () throws Exception{
        
        Iterator itr = _knownMicroformats.iterator();
        Vector<Vector> result = new Vector();
        
        while (itr.hasNext()){
            try {
                result.add(parseDocument(itr.next().toString()));
            }
            catch (Exception e) {
                result.clear();
                throw new Exception(e);
            }
        }
        return result;
    }
}